package com.whosly.mysql.protocol.packet.impl.prepare;

import com.whosly.mysql.protocol.connection.IConnection;
import com.whosly.mysql.protocol.packet.impl.BinaryPacket;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;

/**
 * @author fengyang(yueny09@163.com)
 * @date 2023年06月30日 下午4:48
 */
@Slf4j
public class PrepStmtProcessor {
    private static PrepStmtProcessor instance = new PrepStmtProcessor();

    public static PrepStmtProcessor getInstance() {
        if (instance == null) {
            instance = new PrepStmtProcessor();
        }
        return instance;
    }

    private PrepStmtProcessor() {

    }



    /**
     * 处理Prepare请求
     *
     * @param conn
     * @param message
     */
    public String prepare(IConnection conn, byte[] message, String processId) throws UnsupportedEncodingException {

        return "";
    }

    /***
     * 初始化上下文
     * @param
     * @return @link void
     * @throws
     * @author fengyang
     * @date 2023/6/20 上午10:53
     * @see <a href="yueny09@163.com">mailTo: yueny09@163.com</a>
     */
    public void initPrepContext(IConnection prepConnection,String sql) throws UnsupportedEncodingException {

    }

    public void close(IConnection conn, BinaryPacket bin) {

    }

    /**
     * 处理execute请求
     *
     * @param conn
     * @param message
     * @return
     */
    public String execute(IConnection conn, byte[] message, String processId) {
        String sql = "";

        return sql;
    }

    /***
     * 获取sql的参数数量
     * @param
     * @return @link int
     * @throws
     * @author fengyang
     * @date 2023/6/20 上午10:26
     * @see <a href="yueny09@163.com">mailTo: yueny09@163.com</a>
     */
    public int countSqlParam(String sql,String indexStr){
        // 声明一个要返回的变量
        int count = 0;
        if (!StringUtils.isEmpty(sql)){
            // 声明一个初始的下标，从初始位置开始查找
            int index = 0;
            // 获取主数据的长度
            int mainStrLength = sql.length();
            // 获取要查找的数据长度
            int subStrLength = indexStr.length();
            // 如果要查找的数据长度大于主数据的长度则返回0
            if (subStrLength > mainStrLength) {
                return 0;
            }
            // 循环使用indexOf查找出现的下标，如果出现一次则count++
            while ((index = sql.indexOf(indexStr, index)) != -1) {
                count++;
                // 从找到的位置下标加上要查找的字符串长度，让指针往后移动继续查找
                index += subStrLength;
            }
        }
        return count;
    }

}
